#ifndef SUPSQL_H
#define SUPSQL_H

#include <QObject>
#include <QSqlDatabase>
#include<qDebug>
#include<QList>
#include"info.h"





//学生评价老师
struct StuEvalTech{
    QString stu_id;
    QString tech_id;
    QString stu_eval;
};















class supsql : public QObject
{
    Q_OBJECT
public:
    static supsql *ptrSupSql;
    //承接唯一实例
    static supsql *getinstance()
    {
        if(nullptr == ptrSupSql)
        {
            ptrSupSql = new supsql;
        }
        return ptrSupSql;
    }

    explicit supsql(QObject *parent = nullptr);

    void init();



    //查询所有学生的数量
    int getStuCnt();

    //查询所有老师数量
    int getTechCnt();

    //查询某个表的行数
    int getCnt(QString s);

    //查询第几页学生数据
    QList<StuInfo> getPageStu(int page,int uicnt);

    //增加学生
    bool addStu(StuInfo info);

    //删除学生
    bool RemoveStu(QString id);

    //根据表格、检索列和id进行查找
    InfoSet getInfo(Info*type,QString id,bool any=0);

    //根据编号获得教师数据
    TechInfo GetTechInfo(QString id);

    //根据学号获得学生学习经历
    StuExp GetStuExpInfo(QString id);


    //根据教师ID获取科研成果
    QList<Sci_Result>getSciSet(QString tch_id);

    //根据教师ID获取工作经历
    QList<Work_exp>getWorkExp(QString tch_id);

    //根据教师ID获取成长记录表
    QList<Develop>getDeleveop(QString tch_id);

    //获取招聘信息
    QList<Recruit>getRecruit();

    //获取应聘信息
    QList<Appc>getAppc();

    //获取实习管理
    QList<Intern>getIntern(QString tch_id);

    //清空学生表
    bool ClearStuTable();

    //修改学生信息
    bool UpdateStuInfo(StuInfo info);

    //查询所有教师
    QList<TechInfo>getPageTech(int page,int uicnt);

    //查询教师是否存在
    bool IsExistTech(TechInfo info);

    //查询学生是否存在
    bool IsExistStu(StuInfo info);

    //查询评价是否存在
    bool IsExistEval(StuEvalTech info);

    //更新教师信息
    bool changeTechInfo(TechInfo info);

    //增加教师
    bool AddTech(TechInfo info);

    //增加学生对教师评价
    bool AddEval(StuEvalTech info);

    //减少教师
    bool RemoveTech(int username);

    //修改教师密码
    bool UpdateTechPwd(TechInfo info);

    //修改学生密码
    bool UpdateStuPwd(StuInfo info);

    //修改学生经历
    bool UpdateStuExp(StuExp info);

    //根据表名、修改列名、要改成的内容、主键名、主键内容来进行修改。如果delay为1，这个修改是延迟进行的。
    bool UpdateInfo(QString table,QString colname,QString content,QString keyname,QString id,bool delay=1);

    //执行所有延迟执行的指令
    bool executeDelayedCommand();

    //情况所有延迟执行的指令
    void clearCommand(){sqlList.clear();}

signals:
private:
    QSqlDatabase m_db;
    QStringList sqlList;
public slots:
};

#endif // SUPSQL_H
